package vengadores;

import java.util.Vector;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;

/**
 * Clase que genera todas las diferentes pantallas que existen en el juego, estas pantallas incluyen la pantalla de
 * inicio, los mejores, ayuda, créditos, opciones, salir, créditos desplegados al final del juego y la pantalla de
 * captura del nombre del usuario.
 * @author Felipe Donato Arrazola Gómez 1165547
 * @author Jorge de Jesús Tinoco Huesca 1165318
 * @author Arturo Ayala Tello 1164742
 */

public class Pantalla extends GameCanvas implements Animable{

    private AppJuego midlet;
    private Object[] elementos;
    private int ANCHO, ALTO;
    private Animador animador;
    private Graphics g;
    private boolean botonApretado = false;
    private boolean seleccionSonido;
    /**
     * Constante numérica con valor de 0, que guarda el tipo de pantalla inicio
     */
    public static final int INICIO = 0;
    /**
     * Constante numérica con valor de 2, que guarda el tipo de pantalla Mejores
     */
    public static final int MEJORES = 2;
    /**
     * Constante numérica con valor de 3, que guarda el tipo de pantalla Ayuda
     */
    public static final int AYUDA = 3;
    /**
     * Constante numérica con valor de 4, que guarda el tipo de pantalla de Creditos
     */
    public static final int CREDITOS = 4;
    /**
     * Constante numérica con valor de 5, que guarda el tipo de pantalla de Opciones
     */
    public static final int OPCIONES = 5;
    /**
     * Constante numérica con valor de 6, que guarda el tipo de pantalla de Salir
     */
    public static final int SALIR = 6;
    /**
     * Constante numérica con valor de 7, que guarda el tipo de pantalla de créditos desplegada al final del juego
     */
    public static final int CREDITOS_FINAL = 7;
    /**
     * Constante numérica con valor de 8, que guarda el tipo de pantalla de captura de datos
     */
    public static final int CAPTURA = 8;
    private int tipo;//guarda el tipo de pantalla
    private int opcion;//Para la pantalla de opciones
    private int x;//es la variable que guarda la posición actual en x
    private int yNo;//es la variable que guarda la posición en y para no
    private int ySi;//es la variable que guarda la posición en y para si
    private int secuenciaAparecer[] =   {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}; // secuencia que se utiliza par ala pantalla inicio
    private int secuenciaPresiona[] = {4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5}; //secuencia que se utiliza para la pantalla inicio
    private static int ULT_APARECER; //Variable que guarda el último frame de la secuencia para aparecer
    private int xVibracion, xSonido, yVibracion, ySonido; //variables que guardan la posición de todas las opciones


    /**
     * Constructor de la clase que genera una pantalla dado el tipo que se le menada como parámetro
     * @param app es la aplicación a la cual pertenece la pantalla
     * @param tipo es el tipo de pantalla a generar
     * @throws Exception Si las imágenes no existen en la carpeta
     */

    public Pantalla(AppJuego app, int tipo) throws Exception{
        super(true);
        midlet = app;
        setFullScreenMode(true);
        ANCHO = getWidth();
        ALTO = getHeight();
        g = getGraphics();
        this.tipo = tipo;
        switch(this.tipo){
            case (INICIO):
                String activar = "¿Activar sonido?", si = "Sí", no = "No";
                Image miraSel = Image.createImage("/Mira1.png");
                Sprite pantalla = new Sprite(Image.createImage("/SpriteInicio.png"),240,320);
                ULT_APARECER = secuenciaAparecer.length-1;
                pantalla.setFrameSequence(secuenciaAparecer);
                seleccionSonido = false;
                elementos = new Object[5];
                elementos[0] = pantalla;
                elementos[1] = activar;
                elementos[2] = si;
                elementos [3] = no;
                elementos[4] = miraSel;
                break;
            case (MEJORES):
                Fondo fondo = new Fondo("/PantallaMejores.png");
                String [] nombres = midlet.getNombresGuardados();
                int [] scores = midlet.getPuntuaciones();
                String [] nombresFormato = new String [nombres.length];
                String [] scoresFormato = new String[scores.length];
                for (int i = 0; i < nombresFormato.length; i++){
                    nombresFormato[i] = (i+1)+": "+nombres[i];
                    scoresFormato[i] =  scores[i]+"";
                }
                nombres = null;
                scores = null;
                elementos = new Object[3];
                elementos[0] = fondo;
                elementos[1] = nombresFormato;
                elementos[2] = scoresFormato;
                break;
            case (AYUDA):
                Sprite ayuda = new Sprite(Image.createImage("/MenuAyuda.png"),ANCHO,ALTO);
                elementos = new Object[1];
                elementos[0] = ayuda;
                break;
            case (CREDITOS):
                Fondo fondoCreditos = new Fondo("/PantallaCreditos.png");
                Fondo creditos = new Fondo("/creditosCompleto.png");
                creditos.setY(0);
                elementos = new Object[2];
                elementos[0] = fondoCreditos;
                elementos[1] = creditos;
                break;
            case (OPCIONES):
                Sprite opciones = new Sprite(Image.createImage("/PantallaOpciones.png"),ANCHO,ALTO);
                Image mira = Image.createImage("/Mira1.png");
                if (midlet.deseaVibracion())
                    xVibracion = 73;
                else
                    xVibracion = 148;
                if (midlet.deseaReproducir())
                    xSonido = 73;
                else
                    xSonido = 148;
                yVibracion = 127;
                ySonido = 256;
                elementos = new Object[2];
                elementos[0] = opciones;
                elementos[1] = mira;
                break;
            case(SALIR):
                Fondo fondoSalir = new Fondo("/SeguroSalir.png");
                mira = Image.createImage("/Mira1.png");
                opcion = 0;
                elementos = new Object[2];
                elementos[0] = fondoSalir;
                elementos[1] = mira;
                x = 74;
                yNo = ALTO-130;
                ySi = ALTO-60;
                break;
            case(CREDITOS_FINAL):
                Fondo creditosF = new Fondo("/creditosCompleto.png");
                creditosF.setY(0);
                elementos = new Object[1];
                elementos[0] = creditosF;
                if (midlet.deseaReproducir())
                    midlet.reproducir("surrcomp.mid");
                break;
            case(CAPTURA):
                String letras = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                String score = "Score obtenido: "+midlet.getScoreTemp();
                Sprite[] letrasSprite = new Sprite[3];
                for (int i = 0; i < letrasSprite.length; i++){
                    letrasSprite[i] = new Sprite(Image.createImage("/letras.png"),28,38);
                }
                Vector contenedorLetras = new Vector();
                StringBuffer logicaLetras = new StringBuffer(3);
                Fondo fondoCaptura = new Fondo("/PantallaCaptura.png");
                Image miraCaptura = Image.createImage("/Mira1.png");
                int[] indiceX = {0};
                int[] indiceY = {0};
                int[] logicaPosicion = {0};
                int[] letrasX = {18, 52, 87, 120, 152, 186, 224};
                int [] letrasY = {118, 152, 185, 222};
                elementos = new Object[12];
                elementos[0] = letras;
                elementos[1] = score;
                elementos[2] = letrasSprite;
                elementos[3] = contenedorLetras;
                elementos[4] = logicaLetras;
                elementos[5] = fondoCaptura;
                elementos[6] = miraCaptura;
                elementos[7] = indiceX;
                elementos[8] = indiceY;
                elementos[9] = logicaPosicion;
                elementos[10] = letrasX;
                elementos[11] = letrasY;
                break;
            default:
                break;
        }

        animador = new Animador(this);
        animador.iniciar();
    }

    /**
     * Método que actualiza todos los recursos en la pantalla
     */
    public void actualizar() {
        int tecla = getKeyStates();
        switch (tipo){
            case (INICIO):
                actualizarInicio(tecla);
                break;
            case (MEJORES):
                actualizarMejores(tecla);
                break;
            case (AYUDA):
                actualizarAyuda(tecla);
                break;
            case (CREDITOS):
                actualizarCreditos(tecla);
                break;
            case (OPCIONES):
                actualizarOpciones(tecla);
                break;
            case(SALIR):
                actualizarSalir(tecla);
                break;
            case(CREDITOS_FINAL):
        try {
            actualizarCreditosFinal(tecla);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
                break;
            case(CAPTURA):
                actualizarCaptura(tecla);
                break;
            default:
                break;
        }
    }

    /**
     * Método que dibuja la pantalla en un entorno gráfico
     */
    public void dibujar() {
        g.setColor(0x000000);
        g.fillRect(0, 0, ANCHO, ALTO);
        switch (tipo){
            case (INICIO):
                dibujarInicio();
                break;
            case (MEJORES):
                dibujarMejores();
                break;
            case (AYUDA):
                dibujarAyuda();
                break;
            case (CREDITOS):
                dibujarCreditos();
                break;
            case (OPCIONES):
                dibujarOpciones();
                break;
            case(SALIR):
                dibujarSalir();
                break;
            case(CREDITOS_FINAL):
                dibujarCreditosFinal();
                break;
            case(CAPTURA):
                dibujarCaptura();
                break;
            default:
                break;
        }
        flushGraphics();
    }

    //Método para actualizar la pantalla inicio
    private void actualizarInicio(int teclaPresionada) {
        if(seleccionSonido){
            Sprite pantalla = (Sprite)elementos[0];
            if(pantalla.getFrame()==ULT_APARECER){
                pantalla.setFrameSequence(secuenciaPresiona);
                ULT_APARECER = secuenciaPresiona.length;
            }
            if ((teclaPresionada & FIRE_PRESSED) != 0  && !botonApretado) {
                if(ULT_APARECER != secuenciaPresiona.length && pantalla.getFrame()< ULT_APARECER){
                    pantalla.setFrameSequence(secuenciaPresiona);
                    ULT_APARECER = secuenciaPresiona.length;
                    botonApretado = true;
                }else{
                    terminar();
                    midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, 0));
                    midlet = null;
                    botonApretado = true;
                    return;
                }
            }if (teclaPresionada == 0){
                botonApretado = false;
            }
            pantalla.nextFrame();
        }else{
            if ((teclaPresionada & UP_PRESSED) != 0 && !botonApretado){
                botonApretado = true;
                opcion = opcion==0?1:0;
            }else if ((teclaPresionada & DOWN_PRESSED) != 0 && !botonApretado){
                botonApretado = true;
                opcion = opcion==0?1:0;
            }else if((teclaPresionada & FIRE_PRESSED) != 0 && !botonApretado){
                botonApretado = true;
                seleccionSonido = true;
                if (opcion == 0){
                    midlet.cambiarDeseoRep(true);
                    try {
                        midlet.reproducir("inicio.mid");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    return;
                }else{
                    midlet.cambiarDeseoRep(false);
                    return;
                }
            }else if (teclaPresionada == 0){
                botonApretado = false;
            }
        }
    }

    //Método para dibujar la pantalla inicio
    private void dibujarInicio() {
        if(seleccionSonido){
            Sprite imagen = (Sprite)elementos[0];
            imagen.paint(g);
        }else{
            g.setColor(0xFFFFFF);
            String activa = (String)elementos[1], si = (String)elementos[2], no = (String)elementos[3];
            Image mira = (Image)elementos[4];
            g.drawString(activa, ANCHO/2, ALTO/5, Graphics.HCENTER|Graphics.TOP);
            g.drawString(si,ANCHO/2, ALTO-200,Graphics.HCENTER|Graphics.TOP);
            g.drawString(no,ANCHO/2, ALTO-100,Graphics.HCENTER|Graphics.TOP);
            if(opcion == 0){
                g.drawImage(mira, ANCHO/2,ALTO-210, Graphics.HCENTER|Graphics.TOP);
            }else{
                g.drawImage(mira, ANCHO/2,ALTO-110, Graphics.HCENTER|Graphics.TOP);
            }
        }
    }

    //Método para actualizar la pantalla mejores
    private void actualizarMejores(int teclaPresionada) {
        if ((teclaPresionada & FIRE_PRESSED) != 0){
            terminar();
            midlet.ponerPantalla(new Menu(midlet,Menu.PRINCIPAL,MEJORES));
            midlet = null;
            return;
        }
        
    }

    //Método para dibujar la pantalla Mejores
    private void dibujarMejores() {
        Fondo fondo = (Fondo)elementos[0];
        String [] nombres = (String[])elementos[1];
        String [] scores = (String[])elementos[2];
        fondo.dibujar(g);
        g.setColor(0xFFFFFF);
        for (int i = 0; i < nombres.length; i++){
            g.drawString(nombres[i], ANCHO/4, 50+((i+1)*50), Graphics.LEFT|Graphics.TOP);
            g.drawString(scores[i], (ANCHO/4)+100, 50+((i+1)*50), Graphics.LEFT|Graphics.TOP);
        }
        
    }

    //Método que actualiza la pantalla Ayuda
    private void actualizarAyuda(int teclaPresionada) {
        Sprite ayuda = (Sprite) elementos[0];
        if (((teclaPresionada & RIGHT_PRESSED) != 0) && !botonApretado){
            ayuda.nextFrame();
            botonApretado = true;
        }else if((teclaPresionada & FIRE_PRESSED)!= 0 && !botonApretado){
            terminar();
            midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, AYUDA));
            midlet = null;
            botonApretado = true;
            return;
        }if ((teclaPresionada & LEFT_PRESSED)!= 0 && !botonApretado){
            ayuda.prevFrame();
            botonApretado = true;
        }else if ((teclaPresionada) == 0){
            botonApretado = false;
        }
    }

    //Método que dibuja la pantalla Ayuda
    private void dibujarAyuda() {
        Sprite ayuda = (Sprite) elementos[0];
        ayuda.paint(g);
    }

    //Método que actualiza la pantalla de creditos
    private void actualizarCreditos(int teclaPresionada) {
        Fondo creditos = (Fondo) elementos[1];
        if ((teclaPresionada & FIRE_PRESSED) != 0  && !botonApretado) {
            terminar();
            midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, CREDITOS));
            midlet = null;
            botonApretado = true;
            return;
        }else if((teclaPresionada & RIGHT_PRESSED) != 0){
            creditos.mover(10);
            return;
        }else if((teclaPresionada & LEFT_PRESSED) != 0){
            creditos.mover(-10);
            return;
        }else if(teclaPresionada == 0){
            botonApretado = false;
        }
        creditos.mover(-1);
    }

    //Método que dibuja la pantalla de créditos
    private void dibujarCreditos() {
        Fondo fondoCreditos = (Fondo)elementos[0];
        Fondo creditos = (Fondo)elementos[1];
        fondoCreditos.dibujar(g);
        creditos.dibujar(g);
    }

    //Método que actualiza la pantalla de opciones
    private void actualizarOpciones(int teclaPresionada) {
        Sprite opciones = (Sprite)elementos[0];
        if((teclaPresionada & DOWN_PRESSED) != 0 && !botonApretado){
            opciones.nextFrame();
            botonApretado = true;
        }else if ((teclaPresionada & UP_PRESSED) != 0 && !botonApretado){
            opciones.prevFrame();
            botonApretado = true;
        }else if((teclaPresionada & FIRE_PRESSED) != 0 && !botonApretado){
            terminar();
            midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, OPCIONES));
            midlet = null;
            return;
        }else if((teclaPresionada & LEFT_PRESSED) != 0 && !botonApretado && opciones.getFrame() == 0){
            xVibracion = 73;
            midlet.cambiarDeseoVib(true);
        }else if((teclaPresionada & RIGHT_PRESSED) != 0 && !botonApretado && opciones.getFrame() == 0){
            xVibracion = 148;
            midlet.cambiarDeseoVib(false);
        }else if((teclaPresionada & LEFT_PRESSED) != 0 && !botonApretado && opciones.getFrame() == 1){
            xSonido = 73;
            midlet.cambiarDeseoRep(true);
            if(!midlet.estaReproduciendo())
            try {
                midlet.reproducir("fwtbt.mid");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }else if((teclaPresionada & RIGHT_PRESSED) != 0 && !botonApretado && opciones.getFrame() == 1){
            xSonido = 148;
            midlet.cambiarDeseoRep(false);
            if(midlet.estaReproduciendo()){
                midlet.detenerMusica();
            }
        }else if (teclaPresionada == 0){
            botonApretado = false;
        }
    }

    //Método que dibuja la pantalla opciones
    private void dibujarOpciones() {
        Sprite opciones = (Sprite)elementos[0];
        Image mira = (Image)elementos[1];
        opciones.paint(g);
        g.drawImage(mira, xVibracion,yVibracion, Graphics.HCENTER|Graphics.VCENTER);
        g.drawImage(mira, xSonido,ySonido, Graphics.HCENTER|Graphics.VCENTER);

    }

    //Método que actualiza la pantalla salir
    private void actualizarSalir(int teclaPresionada) {
        if ((teclaPresionada & UP_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            opcion = opcion==0?1:0;
        }else if ((teclaPresionada & DOWN_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            opcion = opcion==0?1:0;
        }else if((teclaPresionada & FIRE_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            if (opcion == 0){
                terminar();
                midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, SALIR));
                midlet = null;
                return;
            }else{
                midlet.terminar();
            }
        }else if (teclaPresionada == 0){
            botonApretado = false;
        }
    }

    //Método que dibuja la pantalla de salir
    private void dibujarSalir() {
        Fondo fondoSalir = (Fondo)elementos[0];
        Image mira = (Image)elementos[1];
        fondoSalir.dibujar(g);
        if (opcion == 0){
            g.drawImage(mira, x, yNo, Graphics.HCENTER|Graphics.VCENTER);
        }else{
            g.drawImage(mira, x, ySi, Graphics.HCENTER|Graphics.VCENTER);
        }
    }

    //Método que actualiza la pantalla de créditos que sale al final del juego
    private void actualizarCreditosFinal(int teclaPresionada) throws Exception {
        Fondo creditos = (Fondo) elementos[0];
        if ((teclaPresionada & FIRE_PRESSED) != 0  && !botonApretado) {
            terminar();
            if(midlet.analizar(midlet.getScoreTemp())){
                midlet.ponerPantalla(new Pantalla(midlet,Pantalla.CAPTURA));
            }else{
                midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, 0));
                if(midlet.deseaReproducir()){
                    try {
                        midlet.reproducir("fwtbt.mid");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
            midlet = null;
            botonApretado = true;
            return;
        }else if((teclaPresionada & RIGHT_PRESSED) != 0){
            creditos.mover(10);
            return;
        }else if((teclaPresionada & LEFT_PRESSED) != 0){
            creditos.mover(-10);
            return;
        }else if(teclaPresionada == 0){
            botonApretado = false;
        }
        creditos.mover(-1);
    }

    //Método que dibuja la pantalla de créditos que aparece al final del jueg
    private void dibujarCreditosFinal() {
        Fondo fondoCreditos = (Fondo)elementos[0];
        fondoCreditos.dibujar(g);
    }

    //Método que actualiza la pantalla de captura
    private void actualizarCaptura(int tecla) {
        String letras = (String)elementos[0];
        String score = (String)elementos[1];
        Sprite[] letrasSprite = (Sprite[])elementos[2];
        Vector contenedorLetras = (Vector)elementos[3];
        StringBuffer logicaLetras = (StringBuffer)elementos[4];
        int [] indiceX = (int[])elementos[7];
        int [] indiceY = (int[])elementos[8];
        int [] logicaPosicion = (int[])elementos[9];
        int [] letrasX = (int[])elementos[10];
        int [] letrasY = (int[])elementos[11];
        if ((tecla & LEFT_PRESSED)!=0 && !botonApretado){
            botonApretado = true;
            logicaPosicion[0]--;
            if (logicaPosicion[0] < 0){
                logicaPosicion[0] = 27;
            }
            indiceX[0]--;
            if(indiceX[0]<0){
                indiceX[0] = letrasX.length-1;
                indiceY[0]--;
                if (indiceY[0] < 0){
                    indiceY[0] = letrasY.length-1;
                }
            }
        }else if((tecla & RIGHT_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            logicaPosicion[0]++;
            if (logicaPosicion[0] > 27){
                logicaPosicion[0] = 0;
            }
            indiceX[0]++;
            if(indiceX[0] > letrasX.length-1){
                indiceX[0] = 0;
                indiceY[0]++;
                if (indiceY[0] > letrasY.length-1){
                    indiceY[0] = 0;
                }
            }
        }else if((tecla & UP_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            logicaPosicion[0] -= 7;
            if (logicaPosicion[0] < 0){
                logicaPosicion[0] = (7*letrasY.length)+logicaPosicion[0];
            }
            indiceY[0]--;
            if(indiceY[0] < 0){
                indiceY[0] = letrasY.length-1;
            }
        }else if((tecla & DOWN_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            logicaPosicion[0] += 7;
            if (logicaPosicion[0] > 27){
                logicaPosicion[0] -= (7*letrasY.length);
            }
            indiceY[0]++;
            if(indiceY[0] > letrasY.length-1){
                indiceY[0] = 0;
            }
        }else if((tecla & FIRE_PRESSED) != 0 && !botonApretado){
            botonApretado = true;
            if (logicaPosicion[0] == 27){
                terminar();
                midlet.guardarScore(logicaLetras.toString(),midlet.getScoreTemp());
                midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, 0));
                midlet = null;
            }else if(logicaPosicion[0] == 26){
                if (logicaLetras.length()!=0){
                    contenedorLetras.removeElementAt(contenedorLetras.size()-1);
                    logicaLetras.deleteCharAt(logicaLetras.length()-1);
                }
            }else if(logicaLetras.length() < 3){
                letrasSprite[logicaLetras.length()].setFrame(logicaPosicion[0]);
                contenedorLetras.addElement(letrasSprite[logicaLetras.length()]);
                logicaLetras.append(letras.charAt(logicaPosicion[0]));
                if (logicaLetras.length()== 3){
                    indiceX[0] = letrasX.length-1;
                    indiceY[0] = letrasY.length-1;
                    logicaPosicion[0] = 27;
                }
            }
        }else if(tecla == 0){
            botonApretado = false;
        }
    }

    //Método que dibuja la pantalla de captura
    private void dibujarCaptura() {
        String score = (String)elementos[1];
        Vector contenedorLetras = (Vector)elementos[3];
        Fondo fondo = (Fondo)elementos[5];
        Image mira = (Image)elementos[6];
        int [] indiceX = (int[])elementos[7];
        int [] indiceY = (int[])elementos[8];
        int [] letrasX = (int[])elementos[10];
        int [] letrasY = (int[])elementos[11];
        fondo.dibujar(g);
        if (!contenedorLetras.isEmpty()){
            for (int i = 0; i < contenedorLetras.size(); i++){
                Sprite letraADibujar = (Sprite)contenedorLetras.elementAt(i);
                letraADibujar.setPosition((ANCHO/3)+(i*25), 40);
                letraADibujar.paint(g);
            }
        }
        g.drawImage(mira, letrasX[indiceX[0]], letrasY[indiceY[0]], Graphics.HCENTER|Graphics.VCENTER);
        g.setColor(0xFFFFFF);
        g.drawString(score, 0, ALTO-50, Graphics.LEFT|Graphics.TOP);
    }

    //Método que elimina las referncias de la clase
    private void terminar() {
        switch (tipo){
            case(INICIO):
                Sprite imagen = (Sprite)elementos[0];
                String a = (String)elementos[1], b = (String)elementos[2], c = (String)elementos[3];
                Image mira = (Image)elementos[4];
                imagen = null;
                mira = null;
                a = null; b = null; c = null;
                for (int i = 0; i<elementos.length;i++){
                    elementos[i] = null;
                }
                elementos = null;
                if (midlet.estaReproduciendo())
                    midlet.detenerMusica();
                break;
            case (MEJORES):
                Fondo fondoMejores = (Fondo)elementos[0];
                fondoMejores.terminar();
                fondoMejores = null;
                elementos[0] = null;
                elementos = null;
                break;
            case (AYUDA):
                elementos[0] = null;
                elementos = null;
                break;
            case (CREDITOS):
                Fondo fondoCreditos = (Fondo)elementos[0];
                Fondo creditos = (Fondo)elementos[1];
                fondoCreditos.terminar();
                creditos.terminar();
                elementos[0] = null;
                elementos[1] = null;
                elementos = null;
                break;
            case (OPCIONES):
                elementos[0] = null;
                elementos[1] = null;
                elementos = null;
                break;
            case(SALIR):
                Fondo fondoSalir = (Fondo)elementos[0];
                fondoSalir.terminar();
                elementos[0] = null;
                elementos[1] = null;
                elementos = null;
                break;
            case(CREDITOS_FINAL):
                Fondo fondoC = (Fondo)elementos[0];
                fondoC.terminar();
                elementos[0] = null;
                elementos = null;
                break;
            case(CAPTURA):
                for (int i = 0; i < elementos.length; i++){
                    if (i == 5){
                        Fondo fondo = (Fondo)elementos[i];
                        fondo.terminar();;
                    }
                    elementos[i] = null;
                }
                break;
            default:
                break;
        }
        g = null;
        animador.terminar();
        animador = null;
    }
}